package com.hz.common.utils;

import android.text.TextUtils;
import android.util.Log;

import com.hz.common.api.ILogResult;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Observable;
import java.util.Observer;

public class LogObserverUtils extends Observable {

    private StringBuilder sb;
    private String separator;
    private boolean isLog, isTimeStamp;
    private SimpleDateFormat mFormat;

    private LogObserverUtils() {
    }

    public static LogObserverUtils getInstance() {
        return LogSdkHolder.instance;
    }

    private static class LogSdkHolder {
        private static final LogObserverUtils instance = new LogObserverUtils();
    }

    /**
     * 开启日志订阅，在接口/场景前调用
     */
    public synchronized void addObserver() {
        sb = new StringBuilder();
        super.addObserver(new Observer() {
            @Override
            public void update(Observable o, Object obj) {
                if (sb == null) {
                    return;
                }
                String[] args = (String[]) obj;
                // time
                if (isTimeStamp) {
                    sb.append(args[0]).append("\t");
                }
                // tag
                sb.append(args[1]).append(TextUtils.isEmpty(separator) ? "\t" : separator);
                // msg
                sb.append(args[2]).append(System.lineSeparator());
            }
        });
    }

    /**
     * 取消日志订阅，并返回收集的日志
     *
     * @param result 收集的日志
     */
    public synchronized void deleteObservers(ILogResult result) {
        super.deleteObservers();
        if (result != null) {
            result.result(sb.toString());
            sb = null;
        }
    }

    /**
     * 是否开启日志输出
     *
     * @param isLog true:输出；false：不输出
     * @return 当前LogObserver对象
     */
    public LogObserverUtils isLog(boolean isLog) {
        this.isLog = isLog;
        return this;
    }

    /**
     * 设置日志分割分离器
     *
     * @param separator 分离器
     * @return 当前LogObserver对象
     */
    public LogObserverUtils setSeparator(String separator) {
        this.separator = separator;
        return this;
    }

    /**
     * 是否带有时间戳
     *
     * @param isTimeStamp true:是，false:不带
     * @return 当前LogObserver对象
     */
    public LogObserverUtils isTimeStamp(boolean isTimeStamp) {
        this.isTimeStamp = isTimeStamp;
        return this;
    }

    /**
     * 日志变化输出
     *
     * @param tag 日志的标识
     * @param msg 要输出的信息
     */
    public void log(String tag, String msg) {
        if (isLog) {
            Log.e(tag, msg);
        }
        setChanged();
        notifyObservers(new String[]{isTimeStamp ? getCurTime() : "", tag, msg});
    }

    /**
     * 获取当前时间
     *
     * @return 当前时间
     */
    public String getCurTime() {
        if (mFormat == null) {
            mFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS", Locale.CHINESE);
        }
        return mFormat.format(new Date());
    }
}
